#include<iostream>
#include<memory>

class Test
{
public:
    Test()
    {
        std::cout<<"构建函数\n";
    }
    ~Test()
    {
        std::cout<<"析构函数\n";
    }
    void show()
    {
      std::cout<<"hello"<<std::endl;  
    }
};
using TestPtr=std::shared_ptr<Test>;//若要用智能指针，一开始就全定义好，后面使用只使用TestPtr
template<typename>
class SmartPoint
{
    public:
       SmartPoint(T*p):p(p)
       {
        count++;
       };
       ~SmartPoint()
       {
        count--;
        if(count==0)
            delete P;
       }
    private:
        T*P;
        static int count;
};
int smartPoint::count==0;
int main()
{
    std::shared_ptr<Test> p=std::make_shared<Test>();
    // p->show();
    // std::shared_ptr p2=p;
    // p2->show();
    // std::shared_ptr<Test> p3;
    // p3=p;
    // p3->show();

    //当不再有指针指向这块内存，可以释放内存
   // std::cout<<p.use_count()<<std::endl;//引用计数器：当前有多少个指针指向该内存

    Test *t=new Test;
    std::shared_ptr p(t);
    std::shared_ptr p1(t);
    //共享指针只能发生在智能指针之间  裸指针赋值智能指针不能共享


    //裸指针和智能指针不要混用，容易发生二次释放
    TestPtr p=std::make_shared<Derived>();//智能指针支持多态
    dynamic_cast<Derived*>(p.get());//只有这种需要用一下裸指针
    dynamic_pointer_cast//可以转化智能指针

    return 0;
}